package cn.suchan.jianzhi.q11_numberof1;

import java.util.ArrayList;
import java.util.List;

/**
 * 知识点：二进制中1的个数
 * 题目描述
 * 输入一个整数，输出该数二进制表示中1的个数。其中负数用补码表示。
 *
 * @author suchan
 * @date 2019/05/24
 */
public class Solution {

    private List<Integer> binary = new ArrayList<>();
    private int count = 0;

    /**
     * 这是我手动算的
     * <p>
     * 用时：1ms
     *
     * @param n
     * @return
     */
    public int NumberOf1(int n) {
        long start = System.currentTimeMillis();
        System.out.println("开始时间：" + start);

        char[] chars = Integer.toBinaryString(n).toCharArray();
        for (char aChar : chars) {
            binary.add(Integer.valueOf(String.valueOf(aChar)));
        }
        for (Integer i : binary) {
            if (i.equals(1)) {
                count++;
            }
        }

        long end = System.currentTimeMillis();
        System.out.println("结束时间：" + end);
        return count;
    }

    /**
     * 使用与运算的特性
     * <p>
     * 用时：0ms
     *
     * @param n
     * @return
     */
    public int number1(int n) {
        long start = System.currentTimeMillis();
        System.out.println("开始时间：" + start);

        int count = 0;
        while (n != 0) {
            ++count;
            n = (n - 1) & n;
        }

        long end = System.currentTimeMillis();
        System.out.println("结束时间：" + end);
        return count;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        // int有32位，4个字节
        System.out.println("转二进制之后1的个数为：" + solution.number1(5));
    }
}
